package com.wzl.thread.controller;

import com.wzl.common.VkPublicResponse;
import com.wzl.thread.methods.TcThreadRunnable;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 多线程深入使用
 *
 * @author weizhongli
 * @since 2022-09-17 17:25
 */
@Controller
@Slf4j
public class TcThreadThoroughController {

    /**
     * 关于线程的sleep方法
     * <p>
     * 静态方法：Thread.sleep(1000);
     * 参数是毫秒
     * 作用： 让当前线程进入休眠，进入“阻塞状态”，放弃占有CPU时间片，让给其它线程使用。
     * 这行代码出现在A线程中，A线程就会进入休眠。
     * 这行代码出现在B线程中，B线程就会进入休眠。
     * Thread.sleep()方法，可以做到这种效果：
     * 间隔特定的时间，去执行一段特定的代码，每隔多久执行一次*
     */
    @RequestMapping("/TcThread1")
    @ResponseBody
    public VkPublicResponse thread1() {

        //每打印一个数字睡1s
        for (int i = 0; i < 10; i++) {
            log.info(Thread.currentThread().getName() + "--->" + i);

            // 睡眠1秒
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return new VkPublicResponse();
    }

    /**
     * 关于线程中断sleep()的方法
     * void interrupt()	终止线程的睡眠
     */
    @RequestMapping("/TcThread2")
    @ResponseBody
    public VkPublicResponse thread2() {

        Thread t = new Thread(new TcThreadRunnable());
        t.setName("t");
        t.start();

        // 希望5秒之后，t线程醒来（5秒之后主线程手里的活儿干完了。）
        try {
            Thread.sleep(1000 * 5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 终断t线程的睡眠（这种终断睡眠的方式依靠了java的异常处理机制。）
        t.interrupt();

        return new VkPublicResponse();
    }


    /**
     * Java中合理结束一个进程的执行（常用）
     */
    @RequestMapping("/TcThread3")
    @ResponseBody
    public VkPublicResponse thread3() {

        TcThreadRunnable r = new TcThreadRunnable();
        Thread t = new Thread(r);
        t.setName("t");
        t.start();

        // 模拟5秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 终止线程
        // 你想要什么时候终止t的执行，那么你把标记修改为false，就结束了。
        r.run = false;

        return new VkPublicResponse();

    }

}